const express = require("express")
const app = express()
const joi = require('@hapi/joi')
// 导入并配置cors中间件
const cors = require("cors")
// 导入路由模块
const userRouter = require("./router/user")
const userinfoRouter = require("./router/userinfo")
const articleCatesRouter = require("./router/article_cate")
const articleRouter = require("./router/article")

app.use(cors())
// 配置解析表单数据的中间件,这个文件只能解析一种
app.use(express.urlencoded({
    extended: false
}))
// 托管静态资源文件
app.use('/uploads',express.static("./uploads"))
// 要在路由之前封装 res.cc 函数
app.use((req, res, next) => {
    res.cc = (err, status = 1) => {
        res.send({
            status,
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})
// 解析 token 的中间件  , 就会有 res.user这个属性
const expressJWT = require('express-jwt')
const config = require("./config")
app.use(expressJWT({secret:config.jwtSecretKey,algorithms:['HS256']}).unless({path:/^\/api\//}))

// 并使用路由模块
app.use("/api", userRouter)
app.use("/my", userinfoRouter)
app.use("/my/article", articleCatesRouter)
app.use("/my/article", articleRouter)

// 定义错误级别的中间件
app.use((err, req, res, next) => {
    // 验证失败导致的错误
    if (err instanceof joi.ValidationError) return res.cc(err)
    if(err.name == "UnauthorizedError") return res.cc('认证身份失败')
    // 未知的错误
    res.cc(err)
})
app.listen(3007, () => {
    console.log("Server is running at http://127.0.0.1:3007")
})